/**
 * 
 */
package linkedlist.passed2;

/**
 * @author michael
 *
 */
public class LinkedListCycle {

	/**
	 * Definition for singly-linked list.
	 */
	
	class ListNode {
	    int val;
	    ListNode next;
	    ListNode(int x) {
	        val = x;
	        next = null;
	    }
	}	
	/*
	Linked List Cycle
	Given a linked list, determine if it has a cycle in it.
	
	Follow up:
	Can you solve it without using extra space?
	 */
    public boolean hasCycle(ListNode head) {
    	ListNode slow = head;
    	ListNode fast = head;
    	
    	while(fast != null && fast.next != null) {
    		slow = slow.next;
    		fast = fast.next.next;
    		if (slow == fast) {
    			break;
    		}
    	}
        
    	return fast != null && fast.next != null;
    }
	
    /*
    Linked List Cycle II 
	Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
	
	Follow up:
	Can you solve it without using extra space?
     */
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        
        while (fast != null && fast.next != null) {
        	slow = slow.next;
        	fast = fast.next.next;
        	if (slow == fast) break;
        }
        
        if (fast == null || fast.next == null) return null;
        
        slow = head;
        while (slow != fast) {
        	slow = slow.next;
        	fast = fast.next;
        }
        
        return slow;
    }
    
	/**
	 * 
	 */
	public LinkedListCycle() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
